/*
题目: 得到 K 个黑块的最少涂色次数
给你一个长度为 n 下标从 0 开始的字符串 blocks ，blocks[i] 要么是 'W' 要么是 'B' ，表示第 i 块的颜色。字符 'W' 和 'B' 分别表示白色和黑色。

给你一个整数 k ，表示想要 连续 黑色块的数目。

每一次操作中，你可以选择一个白色块将它 涂成 黑色块。

请你返回至少出现 一次 连续 k 个黑色块的 最少 操作次数。

https://leetcode.cn/problems/minimum-recolors-to-get-k-consecutive-black-blocks
 */
public class MinimumRecolors {
    public int minimumRecolors(String s, int k) {
        // 滑动窗口
        int left = 0;
        int curBlack = 0; // 当前窗口中黑色格子数量
        int result = Integer.MAX_VALUE;
        int n = s.length();

        for (int i = 0; i < n; i++) {
            if (curBlack < k && s.charAt(i) == 'B') {
                curBlack++;
            }
            while (i - left + 1 >= k && left <= i) {
                result = Math.min(result, i - left + 1 - curBlack);
                if (s.charAt(left) == 'B') {
                    curBlack--;
                }
                left ++;
            }
        }

        return result;
    }
}
